//防抖，多次点击只执行最后一次，定时器，只返回一个函数
function debounce(fn, delay) {
  let timer = null;
  return function (e) {
    clearTimeout(timer);
    //然后又创建一个新的setTimeout,这样就能保证interval间隔内如果时间持续触发，就不会执行fn函数
    timer = setTimeout(() => {
      fn.apply(this.arguments);
    }, delay);
  };
}
//处理函数
function handle() {
  console.log("防抖：", Math.random());
}

//滚动事件
window.addEventListener("scroll", debounce(handle, 500));

//节流throttle代码：
function throttle(fn, delay) {
  let canRun = true; //通过闭包保存一个标记
  return function () {
    //在函数开头判断标记是否为true，不为true，则return
    if (!canRun) return;
    //立即设置为false
    canRun = false;
    //将外部传入的函数的执行放在setTimeout中
    setTimeout(() => {
      //最后在setTimeout执行完毕后再把标记设置为true（关键）表是可以执行下一次循环了
      //当定时器没有执行的时候永远都是false，在开头被return掉
      fn.apply(this, arguments);
      canRun = true;
    }, delay);
  };
}

function sayHi(e) {
  console.log("节流：", e.target.innerWidth, e.target.innerHeight);
}
window.addEventListener("resize", throttle(sayHi, 500));

// 递归，求和1-100
function sun(n) {
  if (n == 1) return 1;
}

// 递归，递归方法1,1,2,3,5,8,13,21,34,55,89…求第 n 项
function fib(n) {
  if (n === 1 || n === 2) return 1;
  return fib(n - 2) + fib(n - 1);
}
console.log(fib(3));

// 递归，深拷贝
function clone(o) {
  var temp = {};
  for (var key in o) {
    if (typeof o[key] == "object") {
      temp[key] = clone(o[key]);
    } else {
      temp[key] = o[key];
    }
  }
  return temp;
}

// 递归组件
// 1，组件在它的模板内可以递归的调用自己，只要给组件设置name组件就可以了
// 2，需要注意的是，必须给一个条件来限制数量，否则会抛出错误：max stack size exceeded
// 3，组件递归用来开发一些具体有未知层级关系的独立组件。比如：联机选择器和树形控件
function clone(o) {
  var temp = {};
  for (var key in o) {
    if (typeof o[key] == "object") {
      temp[key] = clone(o[key]);
    } else {
      temp[key] = o[key];
    }
  }
}

//

function A() {}
A.prototype.n = 1;
var b = new A();
A.prototype = {
  n: 2,
  m: 3,
};
var c = new A();
console.log(b.n, b.m, c.n, c.m);
// 什么是节流和防抖

// move才是真正的事件发生时的逻辑代码
function move(e) {
  // 一下是真正逻辑代码code
  console.log(1);
  console.log(e);
  console.log(this);
}
// 把move传递给节流函数，节流函数调用以后 返回一个新函数 赋值给move时间
oBox.onmousemove = throttle(move, 200);

const arr = [1, 3, 3, 2, 1, 1, 4, 5, 3, 4, 7, 6, 5, 7];
const re = arr.reduce(function (p, c) {
  // 把数组的值依次判断，并放入新数组中给
  if (p.includes(c)) {
    return p;
  }
  return [...p, c];
}, []);
console.log(re);

var arr1 = [2, 8, 5, 0, 5, 2, 6, 7, 2];
var newArr = [];
for (var i = 0; i < arr1.length; i++) {
  // 判断当前元素在数组中第一次出现，就把当前元素插入新数组
  if (arr1.indexOf(arr1[i]) === i) {
    newArr.push(arr1[i]);
  }
}
